有没有办法在模板类中处理可变数量的参数?
-
03-07-2019 - |
题
我有一组回调类,用于处理具有可变数量参数的回调。现在我有大约6个不同的实例来处理不同数量的参数。有没有办法使一个实例可以处理可变数量的参数?最后,我希望每个参数都是POD类型或类指针,或结构指针。有什么想法吗?
template <class T>
class kGUICallBackPtr
{
public:
kGUICallBackPtr() {m_obj=0;m_func=0;}
void Set(void *o,void (*f)(void *,T *));
inline void Call(T *i) {if(m_func) m_func(m_obj,i);}
inline bool IsValid(void) {return (m_func!=0);}
private:
void *m_obj;
void (*m_func)(void *,T *);
};
template <class T,class U>
class kGUICallBackPtrPtr
{
public:
kGUICallBackPtrPtr() {m_obj=0;m_func=0;}
void Set(void *o,void (*f)(void *,T *,U *));
inline void Call(T *i, U *j) {if(m_func) m_func(m_obj,i,j);}
inline bool IsValid(void) {return (m_func!=0);}
private:
void *m_obj;
void (*m_func)(void *,T *,U *j);
};
解决方案
尚未使用语言本身,但C ++ 0x将支持可变参数模板。
其他提示
如何通过使用提升绑定来回避此问题的?您可以使您的代码接受单个参数,或者根本不接受任何参数,并在调用站点绑定您需要的参数。
我的第一选择是使用boost :: bind,boost :: function或std :: bind / std :: function和/或c ++ 11 lambda来实现你的目标。但是如果你需要滚动自己的仿函数,那么我会使用boost fusion来创建一个带有单个模板参数的“融合仿函数”。
最终,所有这些库都使用预处理器宏来枚举所有可能的选项,以解决缺少varidic模板的问题。
不隶属于 StackOverflow